package queue

// #1
//type Queue []int
//
//func (q *Queue) Push(v int) {
//	*q = append(*q, v)
//}
//
//func (q *Queue) Pop() int {
//	head := (*q)[0]
//	*q = (*q)[1:]
//	return head
//}
//
//func (q *Queue) IsEmpty() bool {
//	return len(*q) == 0
//}

// #2 Queue支持所有类型
//type Queue []interface{}
//
//func (q *Queue) Push(v interface{}) {
//	*q = append(*q, v)
//}
//
//func (q *Queue) Pop() interface{} {
//	head := (*q)[0]
//	*q = (*q)[1:]
//	return head
//}
//
//func (q *Queue) IsEmpty() bool {
//	return len(*q) == 0
//}

// #3 如果想指定类型
// An FIFO queue.
type Queue []interface{}

// 第一种
//func (q *Queue) Push(v int) {
//	*q = append(*q, v)
//}
//
//func (q *Queue) Pop() int {
//	head := (*q)[0]
//	*q = (*q)[1:]
//	return head.(int)
//}

// 第二种
// Pushes the element into the queue.
// 		e.g. q.Push(123)
func (q *Queue) Push(v interface{}) {
	*q = append(*q, v.(int)) // 运行时才会发现类型错误
}

// Pops element from head.
func (q *Queue) Pop() interface{} {
	head := (*q)[0]
	*q = (*q)[1:]
	return head.(int)
}

// Returns if the queue is empty or not.
func (q *Queue) IsEmpty() bool {
	return len(*q) == 0
}
